package com.woniuxy.vouchers.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.woniuxy.commons.service.FeignUserService;
import com.woniuxy.vouchers.entity.Vouchers;
import com.woniuxy.vouchers.mapper.VouchersMapper;
import com.woniuxy.vouchers.service.VouchersService;
import com.woniuxy.vouchers.vo.GetVouchersVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class VouchersServiceImpl implements VouchersService {


    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private VouchersMapper vouchersMapper;

    /*
     * 查询所有
     * */
    @Override
    public PageInfo<Vouchers> findAll(Integer currentPage, Integer pageSize, String name) {
        PageHelper.startPage(currentPage, pageSize);
        List<Vouchers> list = vouchersMapper.findAll(name);
        PageInfo<Vouchers> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

    /*
     * 获取优惠券,减少优惠券数量
     * */
    @Override
    @Transactional
    public boolean getVouchers(GetVouchersVo getVouchersVo) {
        // 判断是否已经领取过,并判断redis是否有数据
        if (vouchersMapper.findByUidAndVid(getVouchersVo)) {
            return false;
        } else if (!redisTemplate.hasKey("Vouchers_" + getVouchersVo.getVid())) {
            return false;
        }
        // 拿到存在redis中该数据的ttl
        Long ttl = redisTemplate.getExpire("Vouchers_" + getVouchersVo.getVid());
        log.info("ttl: " + ttl);
        // 减少优惠券数量-1
        vouchersMapper.updateVouchersNum(getVouchersVo.getVid());
        // 添加到数据库中
        vouchersMapper.getVouchers(getVouchersVo);
        // 将加息券详情放入 Redis，并设置过期时间
        String recordKey = "Vouchers_" + getVouchersVo.getVid();
        redisTemplate.opsForValue().set(recordKey, null, ttl, TimeUnit.SECONDS);
        return true;
    }

    /*
     * 添加加息券
     * */
    @Override
    public boolean addVouchers(Vouchers vouchers) {
        // 添加到数据库中
        vouchersMapper.addVouchers(vouchers);
        // 将加息券详情放入 Redis，并设置过期时间为 30 天
        String recordKey = "Vouchers_" + vouchers.getId();
        redisTemplate.opsForValue().set(recordKey, null, 30, TimeUnit.DAYS);
        return true;
    }


    /*
     * 编辑加息券
     * */
    @Override
    public boolean updateVouchers(Vouchers vouchers) {
        // 拿到存在redis中该数据的ttl
        //Long ttl = redisTemplate.getExpire("Vouchers_" + vouchers.getId());
        // 更新数据库中数据
         vouchersMapper.updateVouchers(vouchers);
         // 得到数据库更新后的状态,1是启用，0是下架
        Integer state = Integer.valueOf(vouchers.getUsetype());
        // 如果状态是0，则删除Redis中的数据
        if (state == 0) {
            redisTemplate.delete("Vouchers_" + vouchers.getId());
        }
        // 如果状态是启用，则重新加入redis中，并设置余下的过期时间
        if (state == 1) {
            String recordKey = "Vouchers_" + vouchers.getId();
            redisTemplate.opsForValue().set(recordKey, null, 30, TimeUnit.DAYS);
        }
        return true;
    }


}
